#!/usr/bin/env python3
# -*- coding:utf-8 -*-
# @Time: 2019/3/3  21:30
# @Author: 余浪人
# @email: yulangren520@gmail.com
# !/usr/bin/env python3
import random, uuid, re, redis, hashlib, json, base64
from datetime import datetime, date, timedelta
from flask import request, jsonify, abort
from Crypto.PublicKey import RSA
from Crypto.Cipher import PKCS1_v1_5 as c_5
from werkzeug.security import generate_password_hash, check_password_hash


def set_password(O000O0O0OOOOOO000):
    return generate_password_hash(password=O000O0O0OOOOOO000, method='pbkdf2:sha256', salt_length=32)
def check_password(OO0000OO00O00OOO0, OO0O0OO00OOO0O000):
    return check_password_hash(pwhash=OO0000OO00O00OOO0, password=OO0O0OO00OOO0O000)
def get_uuid16():
    OOOOO00O000OOO0OO = str(uuid.uuid4())
    return ''.join(OOOOO00O000OOO0OO.split('-')[:3])
def get_uuid32():
    O0OO0O000OO0O0OOO = str(uuid.uuid4())
    return ''.join(O0OO0O000OO0O0OOO.split('-'))
def get_date():
    return date.today()
def get_date_str():
    return datetime.now().strftime('%Y%m%d')
def random_click():
    return random.randint(1, 1000)
def check_obj(OOOO00OO00OOOOO00):
    if OOOO00OO00OOOOO00 is None:
        return abort(404)
def errors(OO0OOOO00OOOO0000):
    try:
        return re.findall("\['(.*?)'\]", str(OO0OOOO00OOOO0000.errors))[0]
    except:
        return '数据验证错误!'
def add_data(OO000OOOO000OO000, OOOOO000O00O0O0OO, OO00O000O0OO0OOOO, field_val: dict = None):
    try:
        OOO00O000000OO0O0 = OO000OOOO000OO000()
        O0O0OO00O00OO00O0 = OOOOO000O00O0O0OO(request.form)
        if O0O0OO00O00OO00O0.validate():
            OOO00O000000OO0O0.set_attrs(O0O0OO00O00OO00O0.data)
            if field_val and len(field_val):
                OOO00O000000OO0O0.set_attrs(field_val)
            OO00O000O0OO0OOOO.session.add(OOO00O000000OO0O0)
        else:
            return jsonify({"status": 1, "msg": errors(O0O0OO00O00OO00O0)})
        OO00O000O0OO0OOOO.session.commit()
    except:
        OO00O000O0OO0OOOO.session.rollback()
        return jsonify({"status": 1, "msg": "数据库错误!"})
    return jsonify({"status": 0})
def add_tag(O0O00OO00000OOO00: list):
    from apps.models.content_model import TL_Tags_Model, db
    for OOO00O0OOO00O0OOO in O0O00OO00000OOO00:
        try:
            O0O000OO0000OO000 = TL_Tags_Model()
            O0O000OO0000OO000.set_attrs({'tag_name': OOO00O0OOO00O0OOO})
            db.session.add(O0O000OO0000OO000)
            db.session.commit()
        except:
            db.session.rollback()
def edit_data(O00O0OO00O0OOOO00, OOO0O00O0O00O0000, O0OO00OOO00O0OO0O, O0OO00OO0O0OOO0O0, data: dict = None):
    OO00O00OOO0OOOOO0 = O00O0OO00O0OOOO00(request.form)
    try:
        O0000OO0O00O00O0O = OOO0O00O0O00O0000.query.filter_by(id=O0OO00OO0O0OOO0O0).first()
        if OO00O00OOO0OOOOO0.validate() and not check_obj(O0000OO0O00O00O0O):
            O0000OO0O00O00O0O.set_attrs(OO00O00OOO0OOOOO0.data)
            if data:
                O0000OO0O00O00O0O.set_attrs(data)
        else:
            return jsonify({"status": 1, "msg": errors(OO00O00OOO0OOOOO0)})
        O0OO00OOO00O0OO0O.session.commit()
    except:
        O0OO00OOO00O0OO0O.session.rollback()
        return jsonify({"status": 1, "msg": errors(OO00O00OOO0OOOOO0)})
    return jsonify({"status": 0})
def recover_data(OO0OO0O00O00O0000, O000O00O0O0OO0O0O, OOO0O0OO0OO0O0O0O):
    try:
        OOOO00OOO0O0OO0OO = OO0OO0O00O00O0000.query.filter_by(id=OOO0O0OO0OO0O0O0O).first()
        if not check_obj(OOOO00OOO0O0OO0OO) and OOOO00OOO0O0OO0OO:
            OOOO00OOO0O0OO0OO.set_attrs({"status": 1})
        else:
            return jsonify({"status": 1})
        O000O00O0O0OO0O0O.session.commit()
    except:
        O000O00O0O0OO0O0O.session.rollback()
        return jsonify({"status": 1, "msg": "数据库操作异常!"})
    redis_().delete(OOOO00OOO0O0OO0OO.uuid)
    return jsonify({"status": 0})
def recover_datas(OO0OOOOOO00O0O0OO, O00000OOO0000OO0O, O0O0O00OO000OOO0O: list):
    try:
        for OO0O0000OOOOOOOO0 in O0O0O00OO000OOO0O:
            try:
                OOO00O000O0O000OO = OO0OOOOOO00O0O0OO.query.filter_by(id=OO0O0000OOOOOOOO0).first()
                if not check_obj(OOO00O000O0O000OO) and OOO00O000O0O000OO:
                    OOO00O000O0O000OO.set_attrs({"status": 1})
                    redis_().delete(OOO00O000O0O000OO.uuid)
                else:
                    return jsonify({"status": 1})
            except:
                pass
        O00000OOO0000OO0O.session.commit()
    except:
        O00000OOO0000OO0O.session.rollback()
        return jsonify({"status": 1, "msg": "数据库操作异常!"})
    return jsonify({"status": 0})
def fake_delete_data(O0OO0OOOOOO0O0000, O00000O000O0000OO, OOOO0OOO000OO0OO0):
    try:
        OOO0OO0O0OO0O0O0O = O0OO0OOOOOO0O0000.query.filter_by(id=OOOO0OOO000OO0OO0).first()
        if not check_obj(OOO0OO0O0OO0O0O0O) and OOO0OO0O0OO0O0O0O:
            OOO0OO0O0OO0O0O0O.set_attrs({"status": -1})
        else:
            return jsonify({"status": 1})
        O00000O000O0000OO.session.commit()
    except:
        O00000O000O0000OO.session.rollback()
        return jsonify({"status": 1, "msg": "数据库操作异常!"})
    redis_().delete(OOO0OO0O0OO0O0O0O.uuid)
    return jsonify({"status": 0})
def real_delete_data(O00000000OOO0OO0O, OOOO000000O00O000, O0OOOOOO0OOO0O000):
    try:
        OO0OO0OO0000000OO = O00000000OOO0OO0O.query.filter_by(id=O0OOOOOO0OOO0O000).first()
        if not check_obj(OO0OO0OO0000000OO) and OO0OO0OO0000000OO:
            OOOO000000O00O000.session.delete(OO0OO0OO0000000OO)
        else:
            return jsonify({"status": 1, 'msg': '(ID)非法,删除失败!'})
        OOOO000000O00O000.session.commit()
    except:
        OOOO000000O00O000.session.rollback()
        return jsonify({"status": 1, "msg": "数据库操作异常!"})
    redis_().delete(OO0OO0OO0000000OO.uuid)
    return jsonify({"status": 0})
def fake_deletes(OO00000OOO0OOOOO0, OOO0OOOOO0O0O00OO, O0O0OOO00OOO0OO0O: list):
    try:
        for O0OO0OO0O0OOOO00O in O0O0OOO00OOO0OO0O:
            try:
                O00OO00OO00O000O0 = OO00000OOO0OOOOO0.query.filter_by(id=O0OO0OO0O0OOOO00O).first()
                if not check_obj(O00OO00OO00O000O0) and O0OO0OO0O0OOOO00O:
                    O00OO00OO00O000O0.set_attrs({"status": -1})
                    redis_().delete(O00OO00OO00O000O0.uuid)
                else:
                    return jsonify({"status": 1})
            except:
                pass
        OOO0OOOOO0O0O00OO.session.commit()
    except:
        OOO0OOOOO0O0O00OO.session.rollback()
        return jsonify({"status": 1, "msg": "数据库操作异常!"})
    return jsonify({"status": 0})
def real_deletes(OO000OOOOOOO0OO00, O000000O0OOOOO00O, OO000OOOOO000O000: list):
    try:
        for OOO00O0O0O0000O0O in OO000OOOOO000O000:
            try:
                OOO00OO00O00000OO = OO000OOOOOOO0OO00.query.filter_by(id=OOO00O0O0O0000O0O).first()
                if not check_obj(OOO00OO00O00000OO) and OOO00O0O0O0000O0O:
                    O000000O0OOOOO00O.session.delete(OOO00OO00O00000OO)
                    redis_().delete(OOO00OO00O00000OO.uuid)
            except:
                pass
        O000000O0OOOOO00O.session.commit()
    except:
        O000000O0OOOOO00O.session.rollback()
        return jsonify({"status": 1, "msg": "数据库操作异常!"})
    return jsonify({"status": 0})
def member_pwd_edit(O0O000OO0OOO00O0O, OOOOO0O00OO0000OO, OOOOOOOO0O0O00000, OO00O00O0000O00O0, OO00O000O0OO0000O):
    try:
        OO00O0OO000OOOOOO = O0O000OO0OOO00O0O.query.filter_by(id=OO00O000O0OO0000O).first()
        OO0OOO000OO00OOO0 = OOOOO0O00OO0000OO(request.form)
        if OO0OOO000OO00OOO0.validate() and not check_obj(OO00O0OO000OOOOOO):
            if check_password(OO00O0OO000OOOOOO.password, OO00O00O0000O00O0):
                OO00O0OO000OOOOOO.set_attrs(OO0OOO000OO00OOO0.data)
                OOOOOOOO0O0O00000.session.commit()
                return jsonify({"status": 0})
            return jsonify({"status": 1, "msg": "原密码错误!"})
        return jsonify({"status": 1, "msg": errors(OO0OOO000OO00OOO0)})
    except:
        OOOOOOOO0O0O00000.session.rollback()
        return jsonify({"status": 1, "msg": "密码修改异常!"})
def initialize(OO000O000OOOOOOOO, OO0O00O0OO0OO0O0O, data: dict = None):
    try:
        if data:
            OOO0000O000OO0OOO = OO000O000OOOOOOOO()
            OOO0000O000OO0OOO.set_attrs(data)
            OO0O00O0OO0OO0O0O.session.add(OOO0000O000OO0OOO)
            OO0O00O0OO0OO0O0O.session.commit()
            return
        OO0O00O0OO0OO0O0O.session.add(OO000O000OOOOOOOO())
        OO0O00O0OO0OO0O0O.session.commit()
    except:
        OO0O00O0OO0OO0O0O.session.rollback()
def batch_add(OOOO0O0O0O00000OO, OO00OOOOO0O0O0OO0, OOOO00O0000OO000O: list):
    for O00OO0O0OOO0O0OO0 in OOOO00O0000OO000O:
        try:
            OOO0O0O00OO0O00OO = OOOO0O0O0O00000OO()
            OOO0O0O00OO0O00OO.set_attrs(O00OO0O0OOO0O0OO0)
            OO00OOOOO0O0O0OO0.session.add(OOO0O0O00OO0O00OO)
            OO00OOOOO0O0O0OO0.session.commit()
        except:
            OO00OOOOO0O0O0OO0.session.rollback()
    return None
def page_auto(O0O000OO0O0000O00):
    from apps.setting import Config
    OOO000OOOO000OOO0 = Config.PAGE_INTERVAL
    OO00O0OO0OOOOOO00 = int(request.args.get('page', 1))
    OOO0000O0O0O00O00 = O0O000OO0O0000O00.paginate(OO00O0OO0OOOOOO00, OOO000OOOO000OOO0)
    return OOO0000O0O0O00O00.items, OOO0000O0O0O00O00
def redis_(db: int = 1):
    from apps.lib.cache_sys import redis_conf
    O000O0OOO0O0OO000 = redis_conf()
    O00OO0O000000000O = redis.Redis(host=O000O0OOO0O0OO000.redis_host, port=O000O0OOO0O0OO000.redis_port, db=db, password=O000O0OOO0O0OO000.redis_password)
    return O00OO0O000000000O
def create_hash(O00OOOO00O0OO0OO0: str):
    OOO0O00OO00O000O0 = hashlib.md5()
    OOO0O00OO00O000O0.update(O00OOOO00O0OO0OO0.encode())
    return OOO0O00OO00O000O0.hexdigest()
def visiting_user(O0000O0OOO00O0OOO):
    def O0O000O0OOO0O0000(*OOO0O000OOOO00OOO, **OO0OO0000OO0000OO):
        O0O0O0O0O0000OO0O = redis_(db=5)
        OOO000OO00O0O00O0 = datetime.today().strftime('%Y-%m-%d')
        O0OOOOO0O00O000OO = O0O0O0O0O0000OO0O.hget('tl_visit_num', OOO000OO00O0O00O0)
        O0O0O0O0O0000OO0O.hset('tl_visit_num', OOO000OO00O0O00O0, json.dumps(1)) if not O0OOOOO0O00O000OO else O0O0O0O0O0000OO0O.hset('tl_visit_num',OOO000OO00O0O00O0, json.dumps(json.loads(O0OOOOO0O00O000OO) + 1))
        OO0O000OOOO000000 = O0000O0OOO00O0OOO(*OOO0O000OOOO00OOO, **OO0OO0000OO0000OO)
        return OO0O000OOOO000000
    return O0O000O0OOO0O0000
def getEveryDay(day: int = 30):
    O00000OOO00O00O0O = timedelta(days=-day)
    OOO00OOOOO00O0O00 = datetime.now()
    OOO00OOO000OOO0OO = (OOO00OOOOO00O0O00 + O00000OOO00O00O0O).strftime('%Y-%m-%d')
    OOO00000O000O00OO = datetime.today().strftime('%Y-%m-%d')
    O0000OO0OO000OOOO = []
    OOO00OOO000OOO0OO = datetime.strptime(OOO00OOO000OOO0OO, "%Y-%m-%d")
    OOO00000O000O00OO = datetime.strptime(OOO00000O000O00OO, "%Y-%m-%d")
    while OOO00OOO000OOO0OO <= OOO00000O000O00OO:
        O0000OO0OO000OOOO.append(OOO00OOO000OOO0OO.strftime("%Y-%m-%d"))
        OOO00OOO000OOO0OO += timedelta(days=1)
    return O0000OO0OO000OOOO
def del_not_day30(name: str = 'tl_visit_num'):
    OOO0O000000000O00 = getEveryDay()
    O0OO0000O00O0O0O0 = redis_(db=5)
    OO00OOO0000OO0O0O = [OOOOO00OOO0OOO00O.decode('utf-8') for OOOOO00OOO0OOO00O in O0OO0000O00O0O0O0.hkeys(name) if OOOOO00OOO0OOO00O]
    for OO0OOO00000000OO0 in OO00OOO0000OO0O0O:
        if OO0OOO00000000OO0 not in OOO0O000000000O00: O0OO0000O00O0O0O0.hdel(name, OO0OOO00000000OO0)
def private_untie(O00O00OO0000O0OOO: str, OO0000OO00OOO000O: str):
    OO00OOOOO0OOO0O00 = RSA.importKey(O00O00OO0000O0OOO)
    O0O00000OO0O0OO0O = c_5.new(OO00OOOOO0OOO0O00)
    O0000O0OOOO0OOOO0 = O0O00000OO0O0OO0O.decrypt(base64.b64decode(OO0000OO00OOO000O), '').decode('utf-8')
    return O0000O0OOOO0OOOO0
